package thread_test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

// 利用 Callable 接口创建线程完成 1+2+3+...+1000 的任务
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 实现 Callable 接口,这里需要指定一个泛型参数
        // 这里的泛型参数就是你要执行任务的返回值类型
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                // result 用来接收并返回 1+2+3+...+1000 的值
                int result = 0;
                for (int i = 1; i <= 1000; i++) {
                    result += i;
                }
                // 返回得到的结果
                return result;
            }
        };
        // 由于 Thread 中没有提供构造函数来传入 Callable,所以
        // 引入 FutureTask 作为 Callable 与 Thread 的粘合剂
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        // 创建线程 t 把 futureTask 传入
        Thread t = new Thread(futureTask);
        // 启动线程 t
        t.start();
        // 打印结果,这里的 futureTask 调用的 get 方法是带有阻塞功能的
        // 如果线程没有执行完毕, get 就会阻塞,等线程执行完了,return 结果
        // 后,就会被 get 返回回来
        System.out.println("1+2+3+...+1000 = " + futureTask.get());
    }
}
